package com.miage.itrading.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.miage.itrading.entites.Cotation;
import com.miage.itrading.utils.ConnecteurBDD;
import com.miage.itrading.utils.Util;


public class SGBDDao {

	private ArrayList<String>	mnemoniques;
	private ArrayList<String>	noms;
	private ArrayList<Float>	valeurs;
	private ArrayList<Long>		volumes;

	/**
	 * Bufferise les valeurs courantes avant de les ajouter en base
	 * 
	 * @param mnemonique
	 * @param nom
	 * @param valeur
	 * @param volume
	 */
	public void addBufferValeurCourante(String mnemonique, String nom,
			float valeur, long volume) {

		mnemoniques.add(mnemonique);
		noms.add(nom);
		valeurs.add(valeur);
		volumes.add(volume);
	}

	/**
	 * Vide le buffer des valeurs courantes
	 */
	public void flushValeursCourantes() throws SQLException {
		new ConnecteurBDD();
		ConnecteurBDD.connecte();

		ArrayList<Integer> idCotations = new ArrayList<Integer>();

		for (int i = 0; i < noms.size(); ++i) {

			/**
			 * Insère la valeur si elle n'est pas encore dans la base
			 * et récupère l'id de la cotation
			 */
			ResultSet result = ConnecteurBDD.Conn.createStatement(
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_READ_ONLY).executeQuery(
					"SELECT idcotation FROM cotation WHERE nom = \""
							+ noms.get(i) + "\"");

			if (result.next() == false) {
				Statement stat = ConnecteurBDD.Conn.createStatement();
				stat.executeUpdate(
						"INSERT INTO cotation (nom, mnemonique, mnemonique2) VALUES(\""
								+ noms.get(i) + "\",\"" + mnemoniques.get(i)
								+ ".PA\",\"" + mnemoniques.get(i) + "\")",
						Statement.RETURN_GENERATED_KEYS);

				ResultSet rs = stat.getGeneratedKeys();
				if (rs.next()) {
					idCotations.add(rs.getInt(1));
				}

				rs.close();
				stat.close();
			} else {
				idCotations.add(result.getInt(1));
				result.close();
			}
		}

		/**
		 * Insère les valeurs courantes présentes dans le buffer
		 */
		String sqlOrder = "INSERT INTO tempsreel (idcotation, cotation, volume) VALUES ";
		int i;
		for (i = 0; i < noms.size(); ++i) {
			sqlOrder = sqlOrder + "(" + idCotations.get(i) + ", "
					+ valeurs.get(i) + ", " + volumes.get(i) + "), ";
		}
		sqlOrder = sqlOrder.substring(0, sqlOrder.length() - 2);

		// vide les buffers
		mnemoniques.clear();
		noms.clear();
		valeurs.clear();
		volumes.clear();

		ConnecteurBDD.Conn.createStatement().executeUpdate(sqlOrder);

		System.out.println("A inséré " + (i - 1) + " valeurs");
	}

	public List<Cotation> getCotations() throws SQLException {
		new ConnecteurBDD();
		ConnecteurBDD.connecte();

		ArrayList<Cotation> cotations = new ArrayList<Cotation>();

		ResultSet rs = ConnecteurBDD.Conn.createStatement(
				ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)
				.executeQuery("SELECT * from cotation");

		while (rs.next()) {
			Cotation c = new Cotation();

			c.setIdCotation(rs.getInt("idcotation"));
			c.setMnemonique(rs.getString("mnemonique"));
			c.setNom(rs.getString("nom"));

			cotations.add(c);
		}

		return cotations;
	}

	/**
	 * 
	 * 
	 * @param idIndice
	 * @return
	 * @throws SQLException
	 */
	public Date getDateDerniereValeur(int idCotation) throws SQLException {
		new ConnecteurBDD();
		ConnecteurBDD.connecte();

		ResultSet result = ConnecteurBDD.Conn.createStatement(
				ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)
				.executeQuery(
						"SELECT max(date) FROM historique WHERE idcotation = "
								+ idCotation);

		if (result.next()) {
			if (result.getTimestamp(1) == null) {
				return null;
			} else {
				return Util.getDateBySQL(result.getTimestamp(1));
			}

		} else {
			return null;
		}

	}

	/**
	 * Initialise le buffer pour ajouter les valeurs courantes
	 */
	public void initBufferValeursCourantes() {
		mnemoniques = new ArrayList<String>();
		noms = new ArrayList<String>();
		valeurs = new ArrayList<Float>();
		volumes = new ArrayList<Long>();
	}
}